package com.example.androidproject.base;


import android.content.Context;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;

/**
 * ListAsGridBaseAdapter使得listView 实现gridView的效果
 * 由于下拉刷新控件pullToRefresh基于listView实现，在gridView中很难实现下拉刷新下
 * 为了下拉刷新功能，于是退一步采用这种方法来达到目的
 * Created by yuzhiyun on 17/8/9.
 */
public abstract class ListAsGridBaseAdapter extends BaseAdapter {

    //每一行有多少列
    private int numColumns = 1;
    private Context context;

    public ListAsGridBaseAdapter(Context context) {
        this.context = context;
    }

    public int getNumColumns() {
        return numColumns;
    }

    public void setNumColumns(int numColumns) {
        this.numColumns = numColumns;
    }

    @Override
    public int getCount() {
        //item数量不一定是numColumns的倍数，最后一行可能没占满
        return (int) Math.ceil(getItemCount() * 1f / getNumColumns());
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        Log.i("msg", "getView();");
        //由于我们目的是实现gridView的效果，所以每一行的视图都可以用横向的LinearLayout布局来实现
        LinearLayout linearLayout;
        int columnWidth = 0;
        if (viewGroup != null)
            // 平分空间 每一个行中 每一个数据 站一份空间
            // 比如 一行显示3个数据 那么就是 这个三数据去平分这一行的空间
            columnWidth = viewGroup.getWidth() / numColumns;
        if (null == view)
            //未复用view的时候
            linearLayout = createItemRowView(i, columnWidth, viewGroup);
        else {
            //复用view的时候
            linearLayout = (LinearLayout) view;
            //复用view之后，要更新数据
            updateItemRowView(i, viewGroup, linearLayout);
        }
        return linearLayout;
    }

    /**
     * 复用listView的item的时候
     * 更新一行视图对应的数据
     *
     * @param position
     * @param viewGroup
     * @param linearLayout
     */
    private void updateItemRowView(int position, ViewGroup viewGroup, LinearLayout linearLayout) {
        for (int i = 0; i < numColumns; i++) {
            int realposition = numColumns * position + i;
            if (realposition < getItemCount()) {
                View realItem = linearLayout.getChildAt(i);
                //注意这里getItemView第二个参数传递的不是null,而是已经有了的realItem
                //
                getItemView(realposition, realItem, viewGroup);
            } else
                break;
        }
    }

    /**
     * 创建一行视图
     *
     * @param position
     * @param columnWidth
     * @param viewGroup
     * @return
     */
    LinearLayout createItemRowView(int position, int columnWidth, ViewGroup viewGroup) {
        LinearLayout linearLayout = new LinearLayout(context);
        linearLayout.setOrientation(LinearLayout.HORIZONTAL);
        for (int i = 0; i < numColumns; i++) {
            int realposition = numColumns * position + i;
            if (realposition < getItemCount()) {
                View realItem;
                //未复用listView的item,所以这里传递的第二个参数为null
                realItem = getItemView(realposition, null, viewGroup);
                //设置一行中每一小块的宽度
                LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
                params.width = columnWidth;
                realItem.setLayoutParams(params);
                linearLayout.addView(realItem);
            } else
                break;
        }
        return linearLayout;
    }

    /**
     * 用于在子类中获取总item数量
     *
     * @return
     */
    public abstract int getItemCount();

    /**
     * 用于在子类中获取每个item的视图
     *
     * @param i
     * @param view
     * @param viewGroup
     * @return
     */
    public abstract View getItemView(int i, View view, ViewGroup viewGroup);


}
